//package com.source.code.extractor.impl.inner;
//
//import com.github.javaparser.ast.CompilationUnit;
//import com.github.javaparser.ast.Node;
//import com.github.javaparser.ast.NodeList;
//import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
//import com.github.javaparser.ast.body.MethodDeclaration;
//import com.github.javaparser.ast.body.Parameter;
//import com.github.javaparser.ast.expr.MethodCallExpr;
//import com.github.javaparser.ast.type.Type;
//import com.source.code.extractor.ChildMethodExtractor;
//import com.source.code.extractor.MethodInnerExtractor;
//import com.source.code.model.MethodChildInfo;
//import com.source.code.variable.VariableTypeUtil;
//
//import java.util.ArrayList;
//import java.util.List;
//
///**
// * 子方法提取器
// *
// * @author wangchangjie
// * @date 2024/02/01
// */
//public class ClassMethodInnerExtractor implements MethodInnerExtractor {
//
//
//    private ChildMethodExtractor childMethodExtractor;
//
//
//    public ClassMethodInnerExtractor(ChildMethodExtractor childMethodExtractor) {
//        this.childMethodExtractor = childMethodExtractor;
//    }
//
//    @Override
//    public List<MethodChildInfo> getChildMethodAllNames(MethodDeclaration method,
//        ClassOrInterfaceDeclaration classDeclaration, CompilationUnit compilationUnit) {
//
//        List<MethodChildInfo> calledMethods = new ArrayList<>();
//
//        method.walk(Node.TreeTraversal.POSTORDER, node -> {
//            if (node instanceof MethodCallExpr) {
//                MethodCallExpr callExpr = (MethodCallExpr) node;
//                childMethodExtractor.processMethodCall(callExpr, classDeclaration, compilationUnit,
//                    calledMethods);
//            }
//        });
//
//        return calledMethods;
//    }
//
//
//    @Override
//    public List<String> getInterfaceNames(ClassOrInterfaceDeclaration classDeclaration) {
//        List<String> interfaceNames = new ArrayList<>();
//        classDeclaration.getImplementedTypes()
//            .forEach(type -> interfaceNames.add(type.getNameAsString()));
//        return interfaceNames;
//    }
//
//    @Override
//    public String getSuperClassName(ClassOrInterfaceDeclaration classDeclaration) {
//        return classDeclaration.getExtendedTypes().isEmpty() ?
//            "" : classDeclaration.getExtendedTypes().get(0).getNameAsString();
//    }
//
//    @Override
//    public boolean checkOverrideMethod(MethodDeclaration method) {
//        return method.getAnnotationByName("Override").isPresent();
//    }
//
//
//    @Override
//    public String getMethodAllName(MethodDeclaration method,
//        ClassOrInterfaceDeclaration classDeclaration) {
//        String fullMethodName =
//            classDeclaration.getFullyQualifiedName().orElse("unFound") + "#"
//                + method.getNameAsString();
//        return fullMethodName;
//    }
//
//    @Override
//    public String getMethodAbsName(MethodDeclaration method,
//        ClassOrInterfaceDeclaration classDeclaration, CompilationUnit compilationUnit) {
//
//        StringBuilder fullMethodName = new StringBuilder();
//        fullMethodName.append(classDeclaration.getFullyQualifiedName().orElse("unFound"))
//            .append("#")
//            .append(method.getNameAsString())
//            .append("(");
//        // 获取方法参数
//        NodeList<Parameter> parameters = method.getParameters();
//
//        // 遍历每个参数以获取其类型
//        for (int i = 0; i < parameters.size(); i++) {
//            Parameter parameter = parameters.get(i);
//            Type parameterType = parameter.getType();
//            // 获取变量的类型
//            String type = VariableTypeUtil.findVariableType(parameterType.toString(),
//                compilationUnit, classDeclaration);
//            fullMethodName.append(type).append(" ").append("var").append(i).append(", ");
//        }
//        // 如果存在参数，则移除尾部的 ", "
//        if (!parameters.isEmpty()) {
//            fullMethodName.delete(fullMethodName.length() - 2, fullMethodName.length());
//        }
//
//        // 以 ")" 结束 methodAbsName
//        fullMethodName.append(")");
//
//        // 返回构建的 methodAbsName 字符串
//        return fullMethodName.toString();
//
//    }
//
//
//}